﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace LightEngine
{
    namespace VisualTools
    {
        namespace WindowsFormsTools
        {
            /// <Описание перечисления public enum FormStates>
            /// Перечисление содержит список возможных состояний элементов управления формы
            /// FormRuned - форма зааущена, но никаких данных от пользователя она еще не получила.
            /// SpecificDataPresent - пользовательские данные добавлены в форму.
            /// SpecificDataMissing - пользовательские данные были удалены/отсутствуют в форме.
            /// GraphicalDataPresent - графическая информация/отображаемые структуры данных 
            /// загружены в форму.
            /// GraphicalDataMissing  - графическая информация/отображаемые структуры данных были
            /// удалены/отсутствуют.
            /// GraphDataUpdated - графические данные были обновлены.
            /// </Описание перечисления public enum FormStates>
            public enum FormStates
            {
                FormRuned = 1,
                SpecificDataPresent = 2,
                SpecificDataMissing = 3,
                GraphicalDataPresent = 4,
                GraphicalDataMissing = 5,
                GraphDataUpdated = 6
            };

            /// <описание класса public class FormHandler>
            /// Версия класса 1.0
            /// Автор(ы): Ушаков Михаил
            /// Класс предназначен для обработки событий формы, т.е. связвания события с public-интерфейсом 
            /// формы, либо если событие может быть обработано без использования полей формы, то оно обрабатывпется 
            /// внутри класса FormHandler.
            /// Элементы класса:
            /// 1. Константы класса:
            ///    отсутствуют.
            /// 2. Поля класса:
            /// а) List<Control> ControlsVisibility = new List<Control>(0) список элементов управления формы, 
            ///    управление отображением которых (свойство Visible) будет осуществляться классом FormHandler. 
            /// б) List<Control> ControlsPermissionAccess = new List<Control>(0); список элементов управления формы, 
            ///    управление доступом к которых (свойство Enabled) будет осуществляться классом FormHandler.
            /// в) List<ToolStripItem> ToolsToPermissionAccess = new List<ToolStripItem>(0); список инструментов,
            ///    управление доступом к которых (свойство Enabled) будет осуществляться классом FormHandler.
            /// г) Form ParentForm; форму упраление обработкой событий и доступом и видимостью 
            ///    элементов управления и инструментами которой занимается FormHandler.
            /// 3. Методы класса:
            /// а) public void UpdateControlsState(FormStates NewState) обновление состояния элементов управления
            ///    в соотвествии со значением состояния из перечисления FormStates, в зависимости от значения
            ///    NewState все контролы в списках либо видимы и дступны, либо невидимы и закрыты, либо смешанный
            ///    вариант (См. реализацию метода).
            ///    иначе String.Empty.
            /// б) public void UpdateControlsState(Boolean Flag) обновление состояния видимости и доступности
            ///    элементов управления и инструментов в соответствии со значением Flag, если Flag равен true,
            ///    то все элементы доступны и видимы, если false, то все элементы невидимы и недоступны.
            /// в) public void SetControlPermissionState(Control ControlElement, Boolean Flag)
            ///    уствановка доступности элемента управления ControlElement в соответствии со значением Flag, 
            ///    если Flag равен true, то элемент доступен, а если false, то элемент недоступен.
            /// г) public void SetToolPermissionState(ToolStripItem Tool, Boolean Flag) 
            ///    уствановка доступности инструмента Tool в соответствии со значением Flag, 
            ///    если Flag равен true, то элемент доступен, а если false, то элемент недоступен.
            /// д) public void SetControlText(Control ControlElement, String Text) установка свойства Text 
            ///    элемента управления ControlElement значением String Text.
            /// е) public void SetControlText(Control ControlElement, String Text, Boolean Equation) 
            ///    установка свойства Text элемента управления ControlElement значением String Text, 
            ///    если условие Equation равно true, в противном случаем элементу управления
            ///    в свойство Text заносится значение String.Empty.
            /// ж) public void SetToolElementText(ToolStripItem ToolElement, String Text) установка свойства Text 
            ///    инструмента ToolElement значением String Text.
            /// з) public void SetToolElementText(ToolStripItem ToolElement, String Text,
            ///                                   Boolean Flag, String DefaultText)
            ///    установка свойства Text инструмента ToolElement значением String Text, 
            ///    если условие Equation равно true, в противном случаем элементу управления
            ///    в свойство Text заносится значение DefaultText.
            /// и) public void SetFormTitle(String Title) Установка загловка формы (окна) 
            ///    значениим Title.
            /// к) public virtual void HandleEvent(object Sender, EventArgs Args) функция-диспетчер
            ///    соотносит события формы типа Event с Public методами ParentForm, переопределяется в 
            ///    зависимости от внутреннего устройства ParentForm.
            /// л) public virtual void HandleMouseEvent(object Sender, MouseEventArgs Args) функция-диспетчер
            ///    соотносит события формы типа MouseEvent с Public методами ParentForm, переопределяется в 
            ///    зависимости от внутреннего устройства ParentForm.
            /// м) public virtual void HandleKeyboardEvent(object Sender, KeyEventArgs Args) функция-диспетчер
            ///    соотносит события формы типа KeyboardEvent с Public методами ParentForm, переопределяется в 
            ///    зависимости от внутреннего устройства ParentForm.
            /// н) public virtual void HandlePaintEvent(object Sender, PaintEventArgs Args) функция-диспетчер
            ///    соотносит события формы типа PaintEvent с Public методами ParentForm, переопределяется в 
            ///    зависимости от внутреннего устройства ParentForm.
            /// о) public virtual void HandleScrollEvent(object Sender, ScrollEventArgs Args) функция-диспетчер
            ///    соотносит события формы типа ScrollEvent с Public методами ParentForm, переопределяется в 
            ///    зависимости от внутреннего устройства ParentForm.
            /// 4. Свойства и индексаторы класса:
            /// а) protected Form HandledForm; защищенное свойтсво только для чтения, возвращает ссылку на
            ///    ParentForm (необходимо для обработчиков форм, наследующих от FormHandler).
            /// </описание класса public class FormHandler>

            public class FormHandler
            {
                List<Control> ControlsVisibility = new List<Control>(0),
                              ControlsPermissionAccess = new List<Control>(0);
                List<ToolStripItem> ToolsToPermissionAccess = new List<ToolStripItem>(0);
                Form ParentForm;

                public FormHandler(List<Control> ControlsToObserveVis,
                                   List<Control> ControlsToObserveState,
                                   List<ToolStripItem> ToolsToObservrState,
                                   Form ParForm)
                {
                    if (ControlsToObserveVis != null)
                        ControlsVisibility = ControlsToObserveVis;
                    if (ControlsToObserveVis != null)
                        ControlsPermissionAccess = ControlsToObserveState;
                    if (ToolsToObservrState != null)
                        ToolsToPermissionAccess = ToolsToObservrState;

                    ParentForm = ParForm;
                }

                public void UpdateControlsState(FormStates NewState)
                {
                    if (NewState == FormStates.SpecificDataPresent)
                    {
                        foreach (Control FormControl in ControlsPermissionAccess)
                            FormControl.Enabled = true;
                        foreach (ToolStripItem ToolItem in ToolsToPermissionAccess)
                            ToolItem.Enabled = true;
                    }

                    else if (NewState == FormStates.SpecificDataMissing)
                    {
                        foreach (Control FormControl in ControlsPermissionAccess)
                            FormControl.Enabled = false;
                        foreach (ToolStripItem ToolItem in ToolsToPermissionAccess)
                            ToolItem.Enabled = false;
                    }

                    else if (NewState == FormStates.GraphicalDataPresent)
                    {
                        foreach (Control FormControl in ControlsVisibility)
                            FormControl.Visible = true;
                    }

                    else if (NewState == FormStates.GraphicalDataMissing)
                    {
                        foreach (Control FormControl in ControlsVisibility)
                            FormControl.Visible = false;
                    }
                }

                public void UpdateControlsState(Boolean Flag)
                {
                    foreach (Control FormControl in ControlsVisibility)
                        FormControl.Visible = Flag;
                    foreach (Control FormControl in ControlsPermissionAccess)
                        FormControl.Enabled = Flag;
                    foreach (ToolStripItem ToolItem in ToolsToPermissionAccess)
                        ToolItem.Enabled = Flag;
                }

                public void SetControlPermissionState(Control ControlElement, Boolean Flag)
                {
                    foreach (Control FormControl in ControlsPermissionAccess)
                        if (FormControl.Equals(ControlElement))
                        {
                            FormControl.Enabled = Flag;
                        }
                }

                public void SetToolPermissionState(ToolStripItem Tool, Boolean Flag)
                {
                    foreach (ToolStripItem ToolItem in ToolsToPermissionAccess)
                        if (ToolItem.Equals(Tool))
                        {
                            ToolItem.Enabled = Flag;
                        }
                }

                public void SetControlText(Control ControlElement, String Text)
                {
                    ControlElement.Text = Text;
                }

                public void SetControlText(Control ControlElement, String Text, Boolean Equation)
                {
                    if (Equation == true)
                        ControlElement.Text = Text;
                    else
                        ControlElement.Text = String.Empty;
                }

                public void SetToolElementText(ToolStripItem ToolElement, String Text)
                {
                    ToolElement.Text = Text;
                }

                public void SetToolElementText(ToolStripItem ToolElement, String Text,
                                               Boolean Flag, String DefaultText)
                {
                    if (Flag == true)
                        ToolElement.Text = Text;
                    else ToolElement.Text = DefaultText;
                }

                public void SetFormTitle(String Title)
                {
                    ParentForm.Text = Title;
                }

                public virtual void HandleEvent(object Sender, EventArgs Args)
                {

                }

                public virtual void HandleMouseEvent(object Sender, MouseEventArgs Args)
                {

                }

                public virtual void HandleKeyboardEvent(object Sender, KeyEventArgs Args)
                {

                }

                public virtual void HandlePaintEvent(object Sender, PaintEventArgs Args)
                {

                }

                public virtual void HandleScrollEvent(object Sender, ScrollEventArgs Args)
                {

                }

                protected Form HandledForm
                {
                    get { return ParentForm; }
                }
            }
        }
    }
}

